/* eslint-disable no-console */
(function ($) {
    let isUserControl = false;

    $('#settings-modal').on('shown.bs.modal', () => {
        initDeleteBgBtn();
    })

    /**
     * 初始化删除当前壁纸按钮状态
     */
    function initDeleteBgBtn() {
        const $currentBg = $('#wallpaperCarouse .carousel-inner .active')
        // 激活项是系统内置则禁用删除按钮，反之则启用
        $('.delete-bg-btn').prop('disabled', $currentBg.closest('.carousel-item').hasClass('system-control'));
    }

    /**
     * 监听壁纸切换事件（在切换结束后触发）
     * TODO: 无法移除切换过程中的指示器默认状态，视情况自定义处理逻辑
     * @param {Event} e - 切换事件对象
     */
    function handleCarouseSlid(e) {
        // 获取当前激活的轮播项索引
        const currentIndex = e?.to;
        // 更新指示器状态
        $('.carousel-indicators li').removeClass('active');
        $(`.carousel-indicators li[data-slide-to="${currentIndex}"]`).addClass('active');
        // 若为系统内置壁纸，则禁用删除当前壁纸按钮
        isUserControl = $('#wallpaperCarouse .carousel-inner .carousel-item').eq(currentIndex).hasClass('user-control');
        const $deleteBgBtn = $('.delete-bg-btn');
        $deleteBgBtn.prop('disabled', !isUserControl)
    }

    // ================================ 上传壁纸 ================================
    /**
     * 监听上传壁纸点击事件
     */
    $('#bg-upload-btn').on('click', () => {
        // 触发点击文件上传按钮
        $('#bg-upload').trigger('click');
    });

    /**
     * 处理更新壁纸
     * @param {'full' |'single'} updateType - 更新类型：full 全部更新，single 单个更新
     * @param {string} [bgUrl] - 新壁纸 URL
     * @param {number} [index] - 当 updateType 为 full 时需要传入的新壁纸索引
     */
    function handleUpdateWallpaper(updateType, bgUrl, index) {
        // 过滤无效背景图路径
        if (!bgUrl || typeof bgUrl !== 'string') {
            console.warn(`[module] 跳过无效背景图: index=${index}, bg=${bgUrl}`);
            return null;
        }

        // 处理索引值
        index = updateType ==='single'
            ? $('#wallpaperCarouse .carousel-inner .user-control').length + 1 || 1
            : index + 1;

        const $carouselItem = $('<div>')
        .addClass('user-control carousel-item')
        .attr('data-interval', '10000');

        const $badge = $('<span>')
            .addClass('control-type badge badge-pill badge-success')
            .css({
                position: 'absolute',
                top: '10px',
                left: '10px',
                'z-index': '10'
            })
            .text('用户上传');

        const $img = $('<img alt="">')
            .attr({
                src: bgUrl,
                alt: `用户上传壁纸${index}`
            })
            .addClass('d-block')
            .css({
                width: '370px',
                height: '210px',
                'object-fit': 'cover',
                'object-position': 'center'
            })
            .on('error', function() {
                window.handleImageError(this);
            });

        $carouselItem.append($badge, $img);

        return $carouselItem;
    }

    /**
     * 更新 Carousel 组件
     */
    function handleUpdateCarouse() {
        const $carouselItem = $('#wallpaperCarouse .carousel-inner .carousel-item');
        const bgCount = $carouselItem.length;
        // 更新最后图片的指示器 slide-to 数值
        const $lastImage = $('#wallpaperCarouse .carousel-indicators .last-image');
        $lastImage.attr('data-slide-to', bgCount - 1);

        // 更新中间图片的指示器 slide-to 数值
        const $middleImage = $('#wallpaperCarouse .carousel-indicators .middle-image');
        // 壁纸居中索引向上取整
        $middleImage.attr('data-slide-to', Math.max(Math.floor((bgCount / 2) - 1), 1));

        // 去掉多余的无效轮播项
        // TODO: 导致原因不明，但代码已做兼容性处理
        $carouselItem.not(':has(*)').remove();

        // 刷新 Carousel 组件
        setTimeout(() => {
            // 强制刷新 Carousel（如果使用 Bootstrap），避免Bootstrap 的 active 类被 Carousel 组件自身管理，然后被覆盖
            const $carousel = $('#wallpaperCarouse');
            // 销毁旧实例，重新初始化
            $carousel.carousel('dispose').carousel();
            // 设置激活项
            const $freshItems = $('#wallpaperCarouse .carousel-inner .carousel-item'); // 重新选择
            $freshItems.removeClass('active').eq(0).addClass('active');
            // 重新绑定事件
            $carousel.on('slid.bs.carousel', handleCarouseSlid);
            initDeleteBgBtn();
        }, 0);
    }

    /**
     * 更新壁纸显示
     * @param {'full' | 'single'} updateType - 更新类型：full 全部更新，single 单个更新
     * @param {string} [newBgUrl] - 当updateType为'single'时需要传入的新壁纸URL
     */
    async function updateWallpaper(updateType, newBgUrl) {
        const $fragment = $(document.createDocumentFragment());
        if (updateType === 'single') {
            const $image = handleUpdateWallpaper(updateType, newBgUrl);
            $fragment.append($image);
        } else {
            // 加本地缓存中已有的壁纸图列表
            const backgrounds = await window.AppUtils.getBgUrls(false);
            if (backgrounds.length > 0) {
                backgrounds.forEach((bg, index) => {
                    const $image = handleUpdateWallpaper(updateType, bg, index);
                    $fragment.append($image);
                });
            }
        }
        // 一次性插入所有元素
        $('#wallpaperCarouse .carousel-inner').prepend($fragment);
        handleUpdateCarouse();
    }

    /**
     * 壁纸重复上传处理
     * @param {Event} event - 上传事件对象
     * @returns {Promise<boolean>} 是否重复上传
     */
    async function handleDuplicateWallpaper(event) {
        const showToast = async function() {
            window.setModalAccessibilityState(true); // 禁用模态框
            await window.ToastManager.alert({
                icon: 'warning',
                title:'⚠️ 壁纸重复上传',
                text: '请选择其他壁纸重试...',
            });
            event.target.value = ''; // 清空选择
            window.lastUploadHash = null;  // 重置上传标记
            window.setModalAccessibilityState(false); // 激活模态框
        }

        // 先通过文件指纹检查是否重复上传
        // noinspection JSUnresolvedReference
        const file = event.target.files[0];

        if (!file) return true; // 文件不存在时跳过处理

        const fileHash = await window.AppUtils.getFileHash(file); // 生成文件指纹（避免连续重复）
        if (window.lastUploadHash === fileHash) {
            await showToast();
            return true;
        }

        // 再通过本地存储检查是否重复上传
        const backgrounds = await window.AppUtils.getBgUrls(false);
        const fileUrl = await window.AppUtils.readFileAsDataURL(file);
        if (backgrounds.includes(fileUrl)) {
            await showToast();
            return true;
        }

        window.lastUploadHash = fileHash;
        return false;
    }

    const $bgUpload = $('#bg-upload');
    /**
     * 监听壁纸上传取消事件
     */
    $bgUpload.on('cancel', async (e) => {
        const logDesc = e.target.value.length > 0 ? e.target.value : '未选择文件'
        console.debug(`[module] 壁纸取消上传：${logDesc}`)
        await handleDuplicateWallpaper(e);
        e.target.value = ''; // 清空选择
    });

    /**
     * 监听壁纸更新事件
     */
    $bgUpload.on('change',  async (e) => {
        window.setModalAccessibilityState(true); // 禁用模态框
        // 1. 文件重复验证
        const isDuplicated = await handleDuplicateWallpaper(e);
        if (isDuplicated) return;

        // 2. 获取上传文件
        const file = e.target.files[0];
        const filePath = e.target.value;
        e.target.value = ''; // 清空选择

        if (!file) return; // 文件不存在时跳过处理

        // 3. 文件类型验证
        const fileType = file.type;
        const fileTypeDesc = fileType && fileType.length > 0 ? fileType : '未知类型';
        if (!fileType || fileType.length === 0 || ! fileType.startsWith('image/')) {
            await window.ToastManager.alert( {
                icon: 'error',
                title: ' 壁纸上传失败',
                text: `文件类型错误: ${fileTypeDesc}`,
            });
            window.lastUploadHash = null;  // 重置上传标记
            window.setModalAccessibilityState(false); // 激活模态框
            return;
        }

        // 4. 文件大小验证
        const maxSize = 20 * 1024 * 1024; // 20MB限制，等效于20e6
        if (file.size > maxSize) {
            await window.ToastManager.alert( {
                icon: 'error',
                title: ' 壁纸上传失败',
                text: '大小不能超过20MB',
            });
            window.lastUploadHash = null; // 重置上传标记
            window.setModalAccessibilityState(false); // 激活模态框
            return;
        }

        // 5.获取本地缓存中壁纸列表
        let backgrounds = await window.AppUtils.getBgUrls();

        // 6. 读取文件内容
        const reader = new FileReader();
        reader.onload = (event) => { // 设置回调
            try {
                const fileUrl = event.target.result // 获取文件 URL

                //  7. 使用Set去重并限制数量
                const uniqueBackgrounds = new Set(backgrounds);
                if (backgrounds.length >= 5) { // 限制最多5张壁纸
                    const firstItem = backgrounds[0];
                    uniqueBackgrounds.delete(firstItem);
                }
                uniqueBackgrounds.add(fileUrl);
                backgrounds = [...uniqueBackgrounds]; // 转回数组

                // 8. 保存到数据库
                window.__cacheManager.setConfig('image','backgroundCollection',{
                    urls: backgrounds,
                    updateTime: window.AppUtils.formatDateTime(),
                    remark: '新增用户上传的壁纸',
                })

                // 9. 显示上传成功提示
                setTimeout(() => {
                    window.setModalAccessibilityState(true); // 禁用模态框
                    window.ToastManager.alert({
                        title: '✅ 壁纸上传成功',
                        text: '🎉 已添加到展示列表中',
                        imageUrl: fileUrl,
                        imageWidth: 400,
                        imageHeight: 200,
                        imageAlt: "用户上传的壁纸",
                    });
                    window.setModalAccessibilityState(false); // 激活模态框
                }, 100);

                // 10. 更新壁纸显示
                updateWallpaper('single', fileUrl);

                // 11. 激活删除当前壁纸按钮
                if (isUserControl) $('.delete-bg-btn').prop('disabled', false);

                console.debug(`[module] 已添加壁纸：${filePath}`)
            }
            catch (error) {
                console.error('[module] 壁纸处理错误:', error);
                window.ToastManager.alert({
                    icon: 'error',
                    title: ' 壁纸上传失败',
                    text: error.message,
                });
                window.lastUploadHash = null;  // 重置上传标记
            } finally {
                window.setModalAccessibilityState(false); // 激活模态框
            }
        };
        reader.onerror = () => {
            window.ToastManager.alert({
                icon: 'error',
                title: ' 壁纸上传失败',
                text: '文件读取错误',
            });
            window.lastUploadHash = null;  // 重置上传标记
            window.setModalAccessibilityState(false); // 激活模态框
        };
        reader.readAsDataURL(file); // 触发读取，并将文件内容读取为 Data URL 字符串
    });

    // ================================ 删除壁纸 ================================
    /**
     * 删除用户壁纸
     */
    $('.delete-bg-btn').on('click', async () => {
        const $currentBg = $('#wallpaperCarouse .carousel-inner .user-control.active');
        const bgUrl = $currentBg.find('img').attr('src');

        if ($currentBg.length > 0 && bgUrl.length > 0) {
            window.lastUploadHash = null;  // 重置上传标记，避免上传图片-删除图片-上传图片时提示重复上传

            const dark = window.AppUtils.getUserSettings().colorTheme === 'dark';
            const $body = $('body');
            const newBgUrl = dark ===true? $body.data('dark-image'): $body.data('light-image')

            // 1. 当前页面壁纸为待删除壁纸时，页面更新为默认壁纸
            const pageCurrentBackground = $('.wallpaper').css('background-image')
            const pageCurrentBackgroundURL = window.AppUtils.extractBase64Url(pageCurrentBackground);
            if (bgUrl === pageCurrentBackgroundURL) {
                window.AppUtils.setBgImage(newBgUrl, false);
                console.debug('[module] [page] 页面背景已重置为默认壁纸');
            }

            // 2. 当前页面壁纸为本地存储的当前壁纸时，存储更新为默认壁纸
            const dbCurrentBackgroundUrl = await window.AppUtils.getCurrentBgUrl();
            if (bgUrl === dbCurrentBackgroundUrl) {
                window.__cacheManager.setConfig('image', 'currentBackground',{
                    url: newBgUrl,
                    updateTime: window.AppUtils.formatDateTime(),
                    remark: '当前壁纸过期，重置壁纸',
                }).catch(err => console.error('[module] 壁纸设置失败:', err));
                console.debug(`[module] [local] 已更新默认壁纸: ${window.AppUtils.truncateString(newBgUrl, 50)}`);
            }

            // 3. 更新图片轮播列表
            $(`#wallpaperCarouse .carousel-inner .user-control img[src$="${ bgUrl }"]`)
                .closest('.user-control').remove();
            handleUpdateCarouse();

            // 4. 删除本地存储中的壁纸
            let backgrounds = await window.AppUtils.getBgUrls(false);
            const uniqueBackgrounds = new Set(backgrounds);
            const originalBgCount = uniqueBackgrounds.size;
            uniqueBackgrounds.delete(bgUrl);
            backgrounds = [...uniqueBackgrounds]; // 转回数组

            await window.__cacheManager.setConfig('image', 'backgroundCollection', {
                urls: backgrounds,
                updateTime: window.AppUtils.formatDateTime(),
                remark: '删除壁纸',
            })
            if (originalBgCount > backgrounds.length) {
                console.debug(`[module] [local] 已删除本地壁纸: ${window.AppUtils.truncateString(bgUrl, 50)}`);
            }
            window.setModalAccessibilityState(true); // 禁用模态框
            await window.ToastManager.alert({
                title: ' ✅ 壁纸删除成功',
                imageUrl: bgUrl,
                imageWidth: 400,
                imageHeight: 200,
                imageAlt: "用户删除的壁纸",
                text: '🎉 数据更新完成',
            });
            window.setModalAccessibilityState(false); // 激活模态框
        } else {
            console.debug('[module] 未找到过期壁纸');
        }
    })

    /**
     * 设置默认壁纸
     */
    $('.set-bg-btn').on('click', () => {
        const $currentBg = $('#wallpaperCarouse .carousel-inner .carousel-item.active');
        const bgUrl = $currentBg.find('img').attr('src');
        if ($currentBg.length > 0) {
            window.AppUtils.setBgImage(bgUrl, true);
            window.__cacheManager.setConfig('image', 'currentBackground', {
                url: bgUrl,
                updateTime: window.AppUtils.formatDateTime(),
                remark: '设置当前壁纸',
            }).catch(err => console.error('[module] 壁纸设置失败:', err));
            console.debug(`[module] [page] 已设置默认壁纸: ${window.AppUtils.truncateString(bgUrl, 50)}`);
        }
    })

    // ================================ 初始化 ================================
    /**
     * 初始化壁纸
     */
    function initWallpaperCarousel() {
        // 设置首图指示器为 active
        $('.carousel-indicators li:first').addClass('active');
        // 初始化用户上传的壁纸图
        updateWallpaper('full').catch(err => console.error('[module] 壁纸初始化失败:', err));
    }

    initWallpaperCarousel();

    window.initWallpaperCarousel = initWallpaperCarousel;
})(window.jQuery);